package sqlgenerator

import (
	"fmt"
	"time"

	"gitee.com/knowgo/gpa/engine/constants"
)

type pgsql struct {
	baseGen
	paramTag string
}

func init() {
	r := &postresReserved{}
	register(constants.POSTGRES, &pgsql{
		baseGen: baseGen{
			reserved: r,
		},
	}, r)
}

func (p *pgsql) Insert(sql *SQL) (string, []*SQLParam) {
	s, ps := p.baseGen.Insert(sql)
	if sql.ReturnAutoincrPrimaryKey != "" {
		s += fmt.Sprintf(" RETURNING %s", sql.ReturnAutoincrPrimaryKey)
	}
	s = p.replaceParams(s, p.paramTag)
	return s, ps
}

func (p *pgsql) Update(sql *SQL) (string, []*SQLParam, []*SQLParam) {
	s, ps, wps := p.baseGen.Update(sql)
	s = p.replaceParams(s, p.paramTag)
	return s, ps, wps
}

func (p *pgsql) Delete(sql *SQL) (string, []*SQLParam) {
	s, ps := p.baseGen.Delete(sql)
	s = p.replaceParams(s, p.paramTag)
	return s, ps
}

func (p *pgsql) Query(sql *SQL) (string, []*SQLParam) {
	s, ps := p.baseGen.Query(sql)
	s = p.replaceParams(s, p.paramTag)
	return s, ps
}

func (p *pgsql) IsParamDollar() bool {
	return true
}

func (p *pgsql) IsReturnAutoincrPrimaryKeyUseQuery() bool {
	return true
}

func (p *pgsql) GetParamTag() string {
	if p.paramTag == "" {
		p.paramTag = fmt.Sprintf("@param-%d", time.Now().Unix())
	}
	return p.paramTag
}
